/**
 * 文件名：@JsonRequestInterceptor.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.interceptor <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.interceptor;

import java.io.BufferedReader;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import cn.efunbox.afw.core.exception.SystemException;
import cn.efunbox.afw.web.util.AfwWebConstant;
import com.alibaba.fastjson.JSON;

/**
 * 类名：JsonRequestInterceptor  <br />
 *
 * 功能：处理Json请求
 *
 * @author xtwin <br />
 * 创建时间：2015年12月7日 下午3:40:48  <br />
 * @version 2015年12月7日
 */
public class JsonRequestInterceptor extends HandlerInterceptorAdapter {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(JsonRequestInterceptor.class);
	
	// 上下文类型
	protected String contentType = "application/json";
	
	// 是否读取json，默认为true
	protected boolean readJson = true;
	
	// jsonType
	protected Class<?> jsonType;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月7日 下午3:41:07<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		String contextType = request.getContentType();
		
		if (logger.isDebugEnabled()) {
			logger.debug("the contentType is : " + contextType);
		}
		
		if (null != contextType && contextType.toLowerCase().startsWith(this.contentType)) {
			// json请求表示
			request.setAttribute(AfwWebConstant.KEY_JSON_MARK, "Y");
			// 设置默认视图
			//request.setAttribute("view", "Json:");

			// 读取json数据
			if (readJson) {
				
				// 读取出json数据
				String text = readJson(request, handler);
				
				// 保存json文本
				request.setAttribute(AfwWebConstant.KEY_JSON_TEXT, text);
				
				// 将json文本解析为对象
				Object data = parseJson(request, text, handler);
				
				// 保存json对象
				request.setAttribute(AfwWebConstant.KEY_JSON_DATA, data);
			}
		}
		
		return true;
	}
	
	/**
	 * 
	 * 功能：解析json数据 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月7日 下午5:28:14 <br/>
	 */
	protected Object parseJson(HttpServletRequest request, String text, Object handler) throws Exception {
		return null == jsonType ? JSON.parse(text) : JSON.parseObject(text, jsonType);
	}
	
	/**
	 * 
	 * 功能：读取request对象中的json数据 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月7日 下午3:45:58 <br/>
	 */
	protected String readJson(HttpServletRequest request, Object handler) throws Exception {
		StringBuilder sb;
		try {
			BufferedReader br = request.getReader();
			
			sb = new StringBuilder();
			
			String line = null;
			while (true) {
				line = br.readLine();
				
				if (null == line) {
					break;
				}
				
				sb.append(line);
			}
		} catch (Exception e) {
			throw new SystemException("system.error.read.json.error");
		}
		
		if (logger.isDebugEnabled()) {
			logger.debug("request.json is: " + sb.toString());
		}
		
		return sb.toString();
	}

	/**
	 * @version 2015年12月7日-下午3:49:34
	 */
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	/**
	 * @version 2015年12月7日-下午3:49:34
	 */
	public void setReadJson(boolean readJson) {
		this.readJson = readJson;
	}
}